﻿using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Persistencia_y_capa_de_negocio;

namespace clonegame
{
    public partial class formularioEdificioEditar : UserControl
    {
       
        private static readonly formularioEdificioEditar instancia = new formularioEdificioEditar();
        public static formularioEdificioEditar Instancia
        {
            get { return instancia; }
        }

        // Edificio que se está editando.
        private ENEdificio edificio;
        public ENEdificio Ed
        {
            get { return edificio; }
            set { edificio = value; }
        }

        // Lista de unidades.
        private ArrayList listaUn;
        public ArrayList ListaUn
        {
            get { return listaUn; }
            set { listaUn = value; }
        }

        /// <summary>
        /// Constructor.
        /// </summary>
        public formularioEdificioEditar()
        {
            InitializeComponent();

            tbNombre.Enabled = false;
        }

        /// <summary>
        /// Confirma las modificaciones en el edificio. Comprueba que los datos introducidos son correctos y
        /// actualiza la información en la base de datos o añade la información si el edificio es nuevo.
        /// </summary>
        /// <param name="sender">Objeto que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
        private void btAceptar_Click(object sender, EventArgs e)
        {
            bool err = false;
            string error = "Faltan datos en : ";

            try
            {
                if (tbNombre.Text == "")
                {
                    error += "Nombre ";
                    err = true;
                }

                if (tbAtaque.Text.ToString() == "")
                {
                    error += "Ataque ";
                    err = true;
                }

                if (tbDefensa.Text.ToString() == "")
                {
                    error += "Defensa ";
                    err = true;
                }

                if (rtbDescripcion.Text == "")
                {
                    error += "Descripción";
                    err = true;
                }

                if (cbTipo.SelectedIndex == -1)
                {
                    error += "Tipo ";
                    err = true;
                }

                if (pbImagenEd.ImageLocation == "")
                {
                    error += "Imagen ";
                    err = true;
                }

                //Finalizado el control de errores.

                if (!err)
                {
                    ENActividad act = new ENActividad();

                    formularioEdificios.Instancia.Estado = "editar";

                    epGuardar.SetError(btGuardar, "");

                    edificio.Nombre = tbNombre.Text;
                    edificio.RutaImg = edificio.Nombre + ".png";
                    edificio.Tipo = cbTipo.SelectedIndex;
                    edificio.Ataque = Convert.ToInt32(tbAtaque.Text);
                    edificio.Defensa = Convert.ToInt32(tbDefensa.Text);
                    edificio.Descripcion = rtbDescripcion.Text;
                    edificio.Vida = 0;
                    edificio.Tiempo = 0;
                    edificio.Multiplicador = 0.0f;
                    edificio.Admin = formularioMaestro.Instancia.UsuarioLogueado.CuentaAd;

                    if (CADEdificio.Instancia.InsertarEdificio(edificio))
                    {
                        MessageBox.Show("Edificio creado correctamente", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        // Copio la imagen a un directorio del programa

                        string origen = pbImagenEd.ImageLocation;
                        string destino = Application.ExecutablePath;
                        destino = destino.Remove(destino.LastIndexOf(@"\bin\"));
                        destino += @"\imagenes\edificios";
                        destino += @"\" + tbNombre.Text + ".png";

                        // Código para trasladar la imágen también a la web.
                        string destinoWeb = Application.ExecutablePath;
                        destinoWeb = destinoWeb.Remove(destinoWeb.LastIndexOf(@"\clonegame\"));
                        destinoWeb += @"\webclonegame\FormulariosPrivada\ImagenesPrivada\edificios";
                        destinoWeb += @"\" + tbNombre.Text + ".png";

                        File.Copy(origen, destino);
                        File.Copy(origen, destinoWeb);

                        act.Accion = "Alta";
                        act.Responsable = formularioMaestro.Instancia.UsuarioLogueado.CuentaAd;
                        act.Descripcion = "Ha dado de alta un nuevo edificio.";
                        act.Fecha = DateTime.Now.ToString();

                        CADActividad.Instancia.InsertarActividad(act);
                    }
                    else
                    {
                        act.Accion = "Modificación";
                        act.Responsable = formularioMaestro.Instancia.UsuarioLogueado.CuentaAd;
                        act.Descripcion = "Ha modificado el edificio " + tbNombre.Text + ".";
                        act.Fecha = DateTime.Now.ToString();

                        string origen = pbImagenEd.ImageLocation;
                        string destino = Application.ExecutablePath;
                        destino = destino.Remove(destino.LastIndexOf(@"\bin\"));
                        destino += @"\imagenes\edificios";
                        destino += @"\" + tbNombre.Text + ".png";

                        // Código para trasladar la imágen también a la web.
                        string destinoWeb = Application.ExecutablePath;
                        destinoWeb = destinoWeb.Remove(destinoWeb.LastIndexOf(@"\clonegame\"));
                        destinoWeb += @"\webclonegame\FormulariosPrivada\ImagenesPrivada\unidades";
                        destinoWeb += @"\" + tbNombre.Text + ".png";

                        if (File.Exists(destino) && destino != origen)
                        {
                            pbImagenEd.Image.Dispose();
                            ((Image)formularioEdificios.Instancia.dgvEdificios.SelectedRows[0].Cells[0].Value).Dispose();

                            System.GC.Collect();
                            System.GC.WaitForPendingFinalizers();

                            File.Delete(destino);
                            File.Delete(destinoWeb);

                            File.Copy(origen, destino);
                            File.Copy(origen, destinoWeb);
                        }



                        CADActividad.Instancia.InsertarActividad(act);
                    }

                    // Sea lo que sea, el edificio está modificado o creado así que ahora puedo añadir las unidades.
                    CADUnidad.Instancia.AnadeUnidadesEdificio(edificio.Id, edificio.Unidades);

                    // Una vez creadas las unidades creo los recursos que puede crear.
                    CADRecurso.Instancia.AnadeRecursosEdificio(edificio.Id, edificio.RecursosCreables);

                    // Ahora metemos los costes en la BD
                    CADRecurso.Instancia.AnadeCostesEdificio(edificio.Id, edificio.Costes);

                    // Actualizamos el DGV de edificios.
                    formularioEdificios.Instancia.RellenaDGV(true, 1, 5);

                    tbNombre.Enabled = false;

                    // Actualizamos el DGV de bienvenida.
                    formularioBienvenida.Instancia.actualizaResumen();

                    //cargarDatos(edificio.Nombre, edificio.Defensa.ToString(), edificio.Tipo.ToString(), edificio.Ataque.ToString(), edificio.Descripcion.ToString());
                    //form.MuestraForm(formularioBienvenida.Instancia);
                }
                else
                {
                    epGuardar.SetError(btGuardar, error);
                    epGuardar.SetIconAlignment(btGuardar, ErrorIconAlignment.MiddleLeft);
                }
            }
            catch (Exception ex)
            {
                epGuardar.SetIconAlignment(btGuardar, ErrorIconAlignment.MiddleLeft);
                epGuardar.SetError(btGuardar, ex.Message);
            }

           
        }

        /// <summary>
        /// Muestra el formulario de búsqueda y establece el estado del formulario a búsqueda.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btBusqueda_Click(object sender, EventArgs e)
        {
            formularioEdificios.Instancia.MuestraForm(formularioEdificioBuscar.Instancia);
            formularioEdificios.Instancia.Estado = "busqueda";
        }

        private void btImagenEd_Click(object sender, EventArgs e)
        {
            OpenFileDialog imagen = new OpenFileDialog();
            imagen.Filter = "png (*.png)|*.png";
            pbImagenEd.SizeMode = PictureBoxSizeMode.StretchImage;

            if (imagen.ShowDialog() == DialogResult.OK)
            {
                // Hemos seleccionado una imagen.
                // Ahora queremos copiarla.

                string origen = imagen.FileName;

                pbImagenEd.ImageLocation = origen;
            }
        }

        /// <summary>
        /// Carga los datos de la unidad en el formulario.
        /// </summary>
        /// <param name="uni"></param>
        public void cargarDatos(string nombre, string defensa, string tipo, string ataque, string descripcion)
        {
            epGuardar.SetError(btGuardar, "");

            string mdf = Application.ExecutablePath;
            mdf = mdf.Remove(mdf.LastIndexOf(@"\bin\"));

            string mdf2 = mdf.Remove(mdf.LastIndexOf(@"\clonegame"));
            mdf2 += @"\clonegame\imagenes\edificios\";

            tbNombre.Text = nombre;
            tbDefensa.Text = defensa;
            cbTipo.SelectedIndex = Convert.ToInt32(tipo);
            tbAtaque.Text = ataque;
            rtbDescripcion.Text = descripcion;
            pbImagenEd.ImageLocation = mdf2 + nombre + ".png";

            // Inicializamos la lista de unidaes.
            listaUn = new ArrayList();

            ENEdificio ed = CADEdificio.Instancia.getEdificio(nombre);
            ed.Unidades = CADUnidad.Instancia.getUnidadesEdificio(ed.Id);
            ed.Costes = CADRecurso.Instancia.getCostesEdificio(ed.Id);

            listaUn = ed.Unidades;

            
            try
            {
                pbImagenEd.Image = System.Drawing.Image.FromFile(mdf2 + nombre + ".png");
            }
            catch (Exception)
            {
                pbImagenEd.Image = clonegame.Properties.Resources.ImgNoEncontrada;
            }

            lbUnidades.Items.Clear();
            lbRecursos.Items.Clear();
            lbCostes.Items.Clear();

            ArrayList lista = CADUnidad.Instancia.getUnidadesEdificio(Ed.Id);

            foreach (int nom in lista)
            {
                try
                {
                    string nomb = CADUnidad.Instancia.getNombreUnidad(nom);
                    lbUnidades.Items.Add(nomb);
                }
                catch
                {

                }
            }

            ArrayList listab = CADRecurso.Instancia.getRecursosEdificio(Ed.Id);

            foreach (int nom in listab)
            {
                try
                {
                    string nomb = CADRecurso.Instancia.getNombreRecurso(nom);
                    lbRecursos.Items.Add(nomb);
                }
                catch
                {

                }
            }

            ArrayList costes = CADRecurso.Instancia.getCostesEdificio(Ed.Id);

            foreach (int nom in costes)
            {
                try
                {
                    string nomb = CADRecurso.Instancia.getNombreRecurso(nom);
                    lbCostes.Items.Add(nomb);
                }
                catch
                {

                }
            }
        }

        /// <summary>
        /// Quita toda la información del formulario para que se pueda
        /// añadir otro edificio.
        /// </summary>
        public void BorraForm()
        {
            tbNombre.Text = "";
            tbDefensa.Text = "";
            tbAtaque.Text = "";
            this.rtbDescripcion.Text = "";
            pbImagenEd.Image = clonegame.Properties.Resources.ImgNoEncontrada;
            tbNombre.Enabled = true;
            // Activamos un tipo por defecto.
            cbTipo.SelectedIndex = 0;

            lbCostes.Items.Clear();
            lbRecursos.Items.Clear();
            lbUnidades.Items.Clear();
        }

        /// <summary>
        /// Restaura los valores del formulario al estado inicial de cuando se seleccionó el edificio
        /// deshaciendo todos los cambios realizados.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Restaurar_Click(object sender, EventArgs e)
        {
            // Obtenemos los datos originales de la BD.
            ENEdificio ed = CADEdificio.Instancia.getEdificio(tbNombre.Text);

            // Cargamos los datos.
            cargarDatos(ed.Nombre, ed.Defensa.ToString(), ed.Tipo.ToString(), ed.Ataque.ToString(), ed.Descripcion);
        }

        /// <summary>
        /// Evento que se llama al modificar un texbox en el formulario edificioEditar
        /// para poder saber cuando empezamos a editar algo.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void EstEditando(object sender, KeyEventArgs e)
        {
            formularioEdificios.Instancia.Estado = "editando";
        }

        /// <summary>
        /// Muestra una nueva ventana para que se seleccionen las unidades que el edificio podrá generar.
        /// </summary>
        /// <param name="sender">Objeto que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
        private void btModificarUnidades_Click(object sender, EventArgs e)
        {
            formularioEdificioEditarUnidades form = new formularioEdificioEditarUnidades();
            form.NombreEdificio = tbNombre.Text;
            form.ShowDialog();
        }

        /// <summary>
        /// Muestra una nueva ventana para que se seleccionen los recursos que produce el edificio.
        /// </summary>
        /// <param name="sender">Objeto que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
        private void btModificarRecursos_Click(object sender, EventArgs e)
        {
            formularioEdificioEditarRecursos form = new formularioEdificioEditarRecursos();
            form.NombreEdificio = tbNombre.Text;
            form.ShowDialog();
        }

        /// <summary>
        /// Muestra una nueva ventana para que se seleccionen los costes del edificio.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btModificarCostes_Click(object sender, EventArgs e)
        {
            formularioEdificioEditarCostes form = new formularioEdificioEditarCostes();
            form.NombreEdificio = tbNombre.Text;
            form.ShowDialog();
        }


        /// <summary>
        /// Cuando se modifica el tipo del edificio se bloquean/desbloquean opciones del formulario.
        /// </summary>
        /// <param name="sender">Objeto que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
        private void cbTipo_SelectedValueChanged(object sender, EventArgs e)
        {
            switch (cbTipo.SelectedIndex)
            {
                case 0:
                    {
                        // Suministrador.
                        pRecursos.Enabled = true;
                        pUnidades.Enabled = false;
                        lbUnidades.Items.Clear();
                        break;
                    }
                case 1:
                    {
                        // Creador.
                        pRecursos.Enabled = false;
                        lbRecursos.Items.Clear();
                        pUnidades.Enabled = true;
                        break;
                    }
                case 2:
                    {
                        // Defensor.
                        pRecursos.Enabled = false;
                        lbRecursos.Items.Clear();
                        pUnidades.Enabled = false;
                        lbUnidades.Items.Clear();
                        break;
                    }

            }
        }
    }
}
